import { ApiHideProperty, ApiProperty } from '@nestjs/swagger'
import { Type } from 'class-transformer'
import { IsBoolean, IsNumber, IsObject, IsOptional, IsString, ValidateNested } from 'class-validator'
import {
  Column,
  CreateDateColumn,
  Entity,
  JoinColumn,
  ManyToOne,
  OneToMany,
  PrimaryGeneratedColumn,
  UpdateDateColumn,
} from 'typeorm'
import { UserWheelTask } from '../../wheel-task/entities/user-wheel-task.entity'

export class ExpressItem {
  /**
   * 收货人姓名
   */
  @IsString()
  @IsOptional()
  name?: string

  /**
   * 收货人手机号
   */
  @IsString()
  @IsOptional()
  phone?: string

  /**
   * 省
   */
  @IsString()
  @IsOptional()
  province?: string

  /**
   * 市
   */
  @IsString()
  @IsOptional()
  city?: string

  /**
   * 区
   */
  @IsString()
  @IsOptional()
  district?: string

  /**
   * 详细地址
   */
  @IsString()
  @IsOptional()
  address?: string

  /**
   * 邮编
   */
  @IsString()
  @IsOptional()
  postCode?: string
}

/**
 * 官网玩家表
 */
@Entity('player_user')
export class PlayerUser {
  @PrimaryGeneratedColumn('increment')
  @IsNumber()
  playerUserId?: number

  /**
   * 玩家uid
   */
  @Column({ unique: true })
  @IsString()
  uid: string

  /**
   * 玩家用户名
   */
  @Column()
  @IsString()
  username: string

  /**
   * 玩家手机号
   */
  @Column()
  @IsString()
  phone: string

  /**
   * 玩家头像
   */
  @Column({ nullable: true })
  @IsString()
  avatar?: string

  /**
   * 是否预约
   */
  @ApiProperty({ default: false })
  @Column({ default: false })
  @IsBoolean()
  @IsOptional()
  isReserved?: boolean

  /**
   * 邀请人数
   */
  @ApiProperty({ default: 0 })
  @Column({ default: 0 })
  @IsNumber()
  @IsOptional()
  inviteCount?: number

  /**
   * 被邀请人UID
   */
  @Column({ nullable: true })
  invitedByUid?: string

  /**
   * 被谁邀请
   */
  @ManyToOne(() => PlayerUser, player => player.invitedUsers, {
    onDelete: 'SET NULL', // 邀请人被删除时，不要删除被邀请人
  })
  // JoinColumn 必须加在拥有外键的那一侧，而不是关系的“一侧”。
  @JoinColumn({ name: 'invitedByUid', referencedColumnName: 'uid' })
  invitedBy?: PlayerUser

  /**
   * 邀请的用户
   */
  @OneToMany(() => PlayerUser, player => player.invitedBy)
  invitedUsers?: PlayerUser[]

  /**
   * 其他第三方信息
   */
  @Column({ nullable: true, type: 'longtext' })
  @IsString()
  @IsOptional()
  dynamic: string

  /**
   * 问卷最高得分
   */
  @Column({ nullable: true })
  @IsNumber()
  @IsOptional()
  questionScore?: number

  /**
   * 最高角色等级
   */
  @Column({ nullable: true })
  @IsNumber()
  @IsOptional()
  maxRoleLevel?: number

  /**
   * 上次登录时间
   */
  @Column({ nullable: true })
  @IsNumber()
  @IsOptional()
  lastLoginTime?: number

  /**
   * 注册时间
   */
  @Column({ nullable: true })
  @IsNumber()
  @IsOptional()
  regTime?: string

  /**
   * 抽奖次数
   */
  @ApiProperty({ default: 0 })
  @Column({ default: 0 })
  @IsNumber()
  @IsOptional()
  canDrawCount?: number

  /**
   * 收货信息
   */
  @Column({ type: 'json', nullable: true })
  @IsObject()
  @IsOptional()
  @ValidateNested({ each: true })
  @Type(() => ExpressItem)
  expressInfo?: ExpressItem

  /**
   * 任务
   */
  @ApiHideProperty()
  @OneToMany(() => UserWheelTask, userTask => userTask.playerUser)
  userTasks?: UserWheelTask[]

  @CreateDateColumn()
  createdAt?: Date

  @UpdateDateColumn()
  updatedAt?: Date

  // @Allow() // 允许额外的字段
  // [key: string]: any;
}
